/**
 * @author Laboratio Av I
 * @since 18/04/2012 14:03:56
 */
package ar.edu.utn.frgp.banco.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frgp.banco.dao.CuentaDao;
import ar.edu.utn.frgp.banco.dao.connection.ConnectionHandler;
import ar.edu.utn.frgp.banco.dao.connection.IConnectionHandler;
import ar.edu.utn.frgp.banco.domain.Cliente;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;

public class CuentaDaoImpl implements CuentaDao {
	
	
	public Cliente obtenerClienteActivoPreCuenta(int dni) throws DataAccessException {

		 Cliente cliente = null;
	     Statement st = null;
         ResultSet rs = null;
		
		IConnectionHandler handler = new ConnectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			st = cn.createStatement();
			rs = st.executeQuery("SELECT * FROM clientes where clientes.dni = " + dni);
			
			while (rs.next()) {
				
				cliente = new Cliente();
				
				cliente.setDni(dni);
				cliente.setNombre(rs.getString("nombre"));
				cliente.setApellido(rs.getString("apellido"));
				cliente.setDireccion(rs.getString("direccion"));
				cliente.setEmail(rs.getString("email"));
				cliente.setEstado(rs.getInt("estado"));
			}
								
		} catch (SQLException e) {
			System.out.println("Error en algo");
			e.printStackTrace();			
		} finally {
			handler.closeResources(st, cn);
		}
		return cliente;
	}
	
	public void altaCuenta(Cuenta cuenta) throws DataAccessException {

		PreparedStatement ps = null;
		
		IConnectionHandler handler = new ConnectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			ps = cn.prepareStatement("INSERT INTO cuentas VALUES(?,?,?,?,?,?)");
			
			ps.setInt  (1, cuenta.getNrocuenta());
			ps.setInt  (2, cuenta.getDni());
			ps.setInt  (3, cuenta.getTipoCuenta());
			ps.setInt  (4, cuenta.getEstado());
			ps.setDouble(5, cuenta.getSaldo());
			ps.setDouble(6, cuenta.getDescubierto());
			
			ps.executeUpdate();
		
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(ps, cn);
		}
	}
	
		
	public void bajarCuenta(Cuenta cu) throws DataAccessException {
		
		Statement st = null;
		IConnectionHandler handler = new ConnectionHandler();
		Connection cn = handler.getConnection();
		
			try {
				st = cn.createStatement();
				st.executeUpdate("UPDATE cuentas SET estado = 0 where cuentas.dni = " + cu.getDni() + " and cuentas.nrocuenta = " +cu.getNrocuenta());
				System.out.println("La cuenta se dio de baja con exito" );
			} catch (SQLException e) {
				System.out.println("Error al modificar tablas.");
				e.printStackTrace();
			}
			finally {
				handler.closeResources(st, cn);
			 		}
	}
	
	public  void ValidarCuenta(Cuenta cu) throws DataAccessException {
		
		Statement st = null;
		IConnectionHandler handler = new ConnectionHandler();
		Connection cn = handler.getConnection();
		
			try {
				st = cn.createStatement();
				st.executeUpdate("SELECT * FROM cuenta Where cuenta.dni = " + cu.getDni());
			} catch (SQLException e) {
				System.out.println("Error el Numero de DNI del Cliente no se encontro.");
				e.printStackTrace();
			}
			try {
				st = cn.createStatement();
				st.executeUpdate("SELECT * FROM cuenta Where cuentas.nrocuenta = " +cu.getNrocuenta());
			} catch (SQLException e) {
				System.out.println("Error el Numero de Cuenta del Cliente no se encontro.");
				e.printStackTrace();
			}
			
	}
	
	public List<Cuenta> obtenerCuenta(int nroCuenta) throws DataAccessException {
			 
		Statement st = null;
		ResultSet rs = null;
		
		List<Cuenta> cuenta = new ArrayList<Cuenta>();
		
		IConnectionHandler handler = new ConnectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			st = cn.createStatement();
			
			rs = st.executeQuery("SELECT * FROM cuenta Where cuenta.nrocuenta = " + nroCuenta );
			
			Cuenta cu = null;
			while (rs.next()) {
				cu = new Cuenta();
				cu.setNrocuenta (rs.getInt("nrocuenta"));
				cu.setDni		(rs.getInt("dni"));
				cu.setTipoCuenta(rs.getInt("tipo"));
				cu.setEstado	(rs.getInt("estado"));
				cu.setSaldo		(rs.getDouble("saldo"));
				cu.setDescubierto(rs.getDouble("descubierto"));
				cuenta.add(cu);
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, st, cn);
		}
		return cuenta;
	}
	
	@Override
	public List<Cuenta> traerCajaAhorroActivos(int dni) throws DataAccessException {
		 Statement st = null;
	     ResultSet rs = null;
			
		 IConnectionHandler handler = new ConnectionHandler();
		 Connection cn = handler.getConnection();
		
		List<Cuenta> cuenta = new ArrayList<Cuenta>();
		
		try {
			st = cn.createStatement();
			rs = st.executeQuery("SELECT * FROM cuentas WHERE cuentas.dni = " + dni + " and cuentas.tipo = 1 and cuentas.estado = 1" );
			
			Cuenta cu = null;
			
			while (rs.next()) {
				
				cu = new Cuenta();
				cu.setNrocuenta (rs.getInt("nrocuenta"));
				cu.setDni		(rs.getInt("dni"));
				cu.setTipoCuenta(rs.getInt("tipo"));
				cu.setEstado	(rs.getInt("estado"));
				cu.setSaldo		(rs.getDouble("saldo"));
				cu.setDescubierto(rs.getDouble("descubierto"));
			
				cuenta.add(cu);
			}
		} catch (SQLException e) {
			System.out.println("Error al crear tablas.");
			e.printStackTrace();			
		} finally {
			handler.closeResources(st, cn);
		}
		return cuenta;
	}


	@Override
	public List<Cuenta> traerTodaCajaAhorro(int dni) throws DataAccessException {
		Statement st = null;
	     ResultSet rs = null;
			
		 IConnectionHandler handler = new ConnectionHandler();
		 Connection cn = handler.getConnection();
		
		List<Cuenta> cuenta = new ArrayList<Cuenta>();
		
		try {
			st = cn.createStatement();
			rs = st.executeQuery("SELECT * FROM cuentas WHERE cuentas.dni = " + dni + " and cuentas.tipo = 1" );
			
			Cuenta cu = null;
			
			while (rs.next()) {
				
				cu = new Cuenta();
				cu.setNrocuenta (rs.getInt("nrocuenta"));
				cu.setDni		(rs.getInt("dni"));
				cu.setTipoCuenta(rs.getInt("tipo"));
				cu.setEstado	(rs.getInt("estado"));
				cu.setSaldo		(rs.getDouble("saldo"));
				cu.setDescubierto(rs.getDouble("descubierto"));
			
				cuenta.add(cu);
			}
		} catch (SQLException e) {
			System.out.println("Error al crear tablas.");
			e.printStackTrace();			
		} finally {
			handler.closeResources(st, cn);
		}
		return cuenta;
	}


	@Override
	public List<Cuenta> traerCuentasCorrientesActivos(int dni) throws DataAccessException {
		Statement st = null;
	     ResultSet rs = null;
			
		 IConnectionHandler handler = new ConnectionHandler();
		 Connection cn = handler.getConnection();
		
		List<Cuenta> cuenta = new ArrayList<Cuenta>();
		
		try {
			st = cn.createStatement();
			rs = st.executeQuery("SELECT * FROM cuentas WHERE cuentas.dni = " + dni + " and cuentas.tipo = 2 and cuentas.estado = 1" );
			
			Cuenta cu = null;
			
			while (rs.next()) {
				cu = new Cuenta();
				cu.setNrocuenta (rs.getInt("nrocuenta"));
				cu.setDni		(rs.getInt("dni"));
				cu.setTipoCuenta(rs.getInt("tipo"));
				cu.setEstado	(rs.getInt("estado"));
				cu.setSaldo		(rs.getDouble("saldo"));
				cu.setDescubierto(rs.getDouble("descubierto"));
			
				cuenta.add(cu);
			}
		} catch (SQLException e) {
			System.out.println("Error al crear tablas.");
			e.printStackTrace();			
		} finally {
			handler.closeResources(st, cn);
		}
		return cuenta;
	}


	@Override
	public List<Cuenta> traerTodaCuentasCorrientes(int dni) throws DataAccessException {
		Statement st = null;
	     ResultSet rs = null;
			
		 IConnectionHandler handler = new ConnectionHandler();
		 Connection cn = handler.getConnection();
		
		List<Cuenta> cuenta = new ArrayList<Cuenta>();
		
		try {
			st = cn.createStatement();
			rs = st.executeQuery("SELECT * FROM cuentas WHERE cuentas.dni = " + dni + " and cuentas.tipo = 2" );
			
			Cuenta cu = null;
			
			while (rs.next()) {
				cu = new Cuenta();
				cu.setNrocuenta (rs.getInt("nrocuenta"));
				cu.setDni		(rs.getInt("dni"));
				cu.setTipoCuenta(rs.getInt("tipo"));
				cu.setEstado	(rs.getInt("estado"));
				cu.setSaldo		(rs.getDouble("saldo"));
				cu.setDescubierto(rs.getDouble("descubierto"));
			
				cuenta.add(cu);
			}
		} catch (SQLException e) {
			System.out.println("Error al crear tablas.");
			e.printStackTrace();			
		} finally {
			handler.closeResources(st, cn);
		}
		return cuenta;
	}

	@Override
	public void actualizarCuenta(Cuenta cu) throws DataAccessException {
		
		 PreparedStatement ps = null;
		    Cuenta cu2 = new Cuenta();
		  			
			IConnectionHandler handler = new ConnectionHandler();
			Connection cn = handler.getConnection();
			
				try {
					
					ps = cn.prepareStatement("UPDATE cuentas  SET tipo = ?" + "where cuentas.dni = " + cu.getDni() + " and cuentas.nrocuenta = " +cu.getNrocuenta() );
					ps.setInt(1, cu2.getTipoCuenta());
					ps.setInt(2, cu.getTipoCuenta());
					ps.executeUpdate();
					
					ps = cn.prepareStatement("UPDATE cuentas  SET saldo = ?" + "where cuentas.dni = " + cu.getDni() + " and cuentas.nrocuenta = " +cu.getNrocuenta());
					ps.setDouble(1, cu2.getSaldo());
					ps.setDouble(2, cu.getSaldo());
					ps.executeUpdate();
					
					ps = cn.prepareStatement("UPDATE cuentas  SET descubierto  = ?" + "where cuentas.dni = " + cu.getDni() + " and cuentas.nrocuenta = " +cu.getNrocuenta());
					ps.setDouble(1, cu2.getDescubierto());
					ps.setDouble(2, cu.getDescubierto());
					ps.executeUpdate();
					
					System.out.println("La Cuenta se modifico con exito" );
				} catch (SQLException e) {
					System.out.println("Error al modificar tablas.");
					throw new DataAccessException(e);
				}
				 finally {
					handler.closeResources(ps, cn);
				 		}	
	}
	
	public void actualizarSaldoCuenta(double saldo, int cuenta) throws DataAccessException {
		
		Statement st = null;
			
		IConnectionHandler handler = new ConnectionHandler();
		Connection cn = handler.getConnection();
		
			try {
				st = cn.createStatement();
				st.executeUpdate("UPDATE cuentas SET saldo = "+ saldo +" where cuentas.nrocuenta = " + cuenta);
				System.out.println("Se actualizo el saldo de la cuenta" );
			} catch (SQLException e) {
				System.out.println("Error al modificar tablas.");
				e.printStackTrace();
			}
			finally {
				handler.closeResources(st, cn);
			 		}
	}
	
	public Cuenta obtenerUnaCuenta(int nroCuenta) throws DataAccessException {
		 		
		Cuenta cu = null;
		Statement st = null;
		ResultSet rs = null;
		
		IConnectionHandler handler = new ConnectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			st = cn.createStatement();
			rs = st.executeQuery("SELECT * FROM cuentas Where cuentas.nrocuenta = " + nroCuenta );
			
			
			while (rs.next()) {
				cu = new Cuenta();
				cu.setNrocuenta (rs.getInt("nrocuenta"));
				cu.setDni		(rs.getInt("dni"));
				cu.setTipoCuenta(rs.getInt("tipo"));
				cu.setEstado	(rs.getInt("estado"));
				cu.setSaldo		(rs.getDouble("saldo"));
				cu.setDescubierto(rs.getDouble("descubierto"));
				
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, st, cn);
		}
		return cu;
	}

	@Override
	public List<Cuenta> traerCuentasActivas(Integer dni)throws DataAccessException {
		
		Statement st = null;
	     ResultSet rs = null;
			
		 IConnectionHandler handler = new ConnectionHandler();
		 Connection cn = handler.getConnection();
		
		List<Cuenta> cuenta = new ArrayList<Cuenta>();
		
		try {
			st = cn.createStatement();
			rs = st.executeQuery("SELECT * FROM cuentas WHERE cuentas.dni = " + dni + " and cuentas.estado = 1" );
			
			Cuenta cu = null;
			
			while (rs.next()) {
				cu = new Cuenta();
				cu.setNrocuenta (rs.getInt("nrocuenta"));
				cu.setDni		(rs.getInt("dni"));
				cu.setTipoCuenta(rs.getInt("tipo"));
				cu.setEstado	(rs.getInt("estado"));
				cu.setSaldo		(rs.getDouble("saldo"));
				cu.setDescubierto(rs.getDouble("descubierto"));
			
				cuenta.add(cu);
			}
		} catch (SQLException e) {
			System.out.println("Error al crear tablas.");
			e.printStackTrace();			
		} finally {
			handler.closeResources(st, cn);
		}
		return cuenta;
	}

	@Override
	public List<Cuenta> traerTodasLasCuentasActivas()throws DataAccessException {
		Statement st = null;
	     ResultSet rs = null;
			
		 IConnectionHandler handler = new ConnectionHandler();
		 Connection cn = handler.getConnection();
		
		List<Cuenta> cuenta = new ArrayList<Cuenta>();
		
		try {
			st = cn.createStatement();
			rs = st.executeQuery("SELECT * FROM cuentas WHERE cuentas.estado = 1" );
			
			Cuenta cu = null;
			
			while (rs.next()) {
				cu = new Cuenta();
				cu.setNrocuenta (rs.getInt("nrocuenta"));
				cu.setDni		(rs.getInt("dni"));
				cu.setTipoCuenta(rs.getInt("tipo"));
				cu.setEstado	(rs.getInt("estado"));
				cu.setSaldo		(rs.getDouble("saldo"));
				cu.setDescubierto(rs.getDouble("descubierto"));
			
				cuenta.add(cu);
			}
		} catch (SQLException e) {
			System.out.println("Error al crear tablas.");
			e.printStackTrace();			
		} finally {
			handler.closeResources(st, cn);
		}
		return cuenta;

	}

	@Override
	public List<Cuenta> traerCuentas(int dni, int estado)throws DataAccessException {
		
		Statement st = null;
	     ResultSet rs = null;
			
		 IConnectionHandler handler = new ConnectionHandler();
		 Connection cn = handler.getConnection();
		
		List<Cuenta> cuenta = new ArrayList<Cuenta>();
		
		try {
			st = cn.createStatement();
			rs = st.executeQuery("SELECT * FROM cuentas WHERE cuentas.dni = " + dni + " and cuentas.tipo = " + estado );
			
			Cuenta cu = null;
			
			while (rs.next()) {
				
				cu = new Cuenta();
				cu.setNrocuenta (rs.getInt("nrocuenta"));
				cu.setDni		(rs.getInt("dni"));
				cu.setTipoCuenta(rs.getInt("tipo"));
				cu.setEstado	(rs.getInt("estado"));
				cu.setSaldo		(rs.getDouble("saldo"));
				cu.setDescubierto(rs.getDouble("descubierto"));
			
				cuenta.add(cu);
			}
		} catch (SQLException e) {
			System.out.println("Error al crear tablas.");
			e.printStackTrace();			
		} finally {
			handler.closeResources(st, cn);
		}
		return cuenta;
	}

	
}
